package object;

import java.awt.*;

/**
 * 测试object中的常用方法
 */

public class Demo {
    public static void main(String[] args) {
        Point p=new Point(1,2);
        /**
            Object定义了toString方法，意思是java中任何类都可以转换为字符串
            主要原因:
            1:java中任何类都可以和字符串链接，结果都是字符串，这就要求其他类型需要能转换
              为字符串
            2:我们经常会将一个对象输出到控制台上，而控制台上只能展示文字，因此java中任何类
              都需要能转换为字符串才可以在控制台上输出

            Object的toString转换的字符串默认格式为:类名@地址 //显然，这一点对我们帮助不大
         */
        String str = p.toString();
        System.out.println(str);

        //以下是会使用到toString方法的常见场景!!!!!!!!
        String s1 = "这是一个Point对象:" + p;//链接字符串时会默认将p转换为String(依靠p的toString方法)
        //上边我们没有主动调用toString，但是这个字符串拼接时，系统默认自动调用的
        System.out.println(s1);
        //向控制台输出一个对象，而输出时也会先将p转换为String后再输出
        System.out.println(p);

        /**
         *  以上输出的结果都是类名@地址，所以，以后我们都要重写toString！

         * 重写toString()！！！
           我们回到Point类里，Alt+INS 生成toString()，系统自动写出该方法，
           此时，我们再输出上述的所有语句，就不再是地址了，而是我们想看到的坐标！
         */

        Point p2 = new Point(1,2);
        System.out.println(p==p2);//p和p2地址不同，因此比较为false
        /**
         *  Object中的equals默认实现方式还是使用的"=="比较，
         *  "=="如果用于引用类型，比较的是两个引用变量中存储的值(两个引用变量指向的对象的地址！！)
            因此子类如果不重写equals方法，则该方法还是"=="
            equals方法的设计初衷是比较两个对象内容是否相同

         *  所以，我们还是回到Point类中，进行重写！
            Alt+INS 生成equals和hasCode，就可以对值进行比较了
         */
        System.out.println(p.equals(p2));//p和p2的值相同，true
    }
}
